This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.
library(magrittr)
filename <-
jsonlite::read_json("C:/Users/jacci/Documents/DS 710/coffee_roasting_profiles/data-raw/saved/Haiti--2021-02-09-20-15-17.json")
# filename2 <-
# jsonlite::toJSON("C:/Users/jacci/Documents/DS 710/coffee_roasting_profiles/data-raw/saved/Angola--2021-02-26-16-16-22.json")
get_data_to_display_at_upload(filename)
get_special_event_times(filename)
get_data_of_times_temps(filename)
get_event_times(filename)
times <- get_data_of_times_temps(filename) %>% dplyr::mutate_if(is.character, as.numeric)#
special_times <- get_special_event_times(filename)
event_times <- get_event_times(filename) %>% dplyr::mutate_if(is.character, as.numeric)
# Get data for certain parameters for chart
time_zero = lubridate::as_datetime("1970-01-01 00:00:00 UTC")
# time_max = max(as_datetime(profile$Time2), na.rm = TRUE)
dry_end = lubridate::as_datetime(event_times$dry_time)
first_crack_start = lubridate::as_datetime(event_times$fc_time_start)
first_crack_end = lubridate::as_datetime(event_times$fc_time_end)
second_crack_start = lubridate::as_datetime(event_times$sc_time_start)
drop_time = lubridate::as_datetime(event_times$drop_time)
max_temp = 500 # Highest temp in chart
plotly::plot_ly(
# BT Line
times,
type = 'scatter',
mode = 'lines',
x = ~ lubridate::as_datetime(time),
line = list(color = "#4DB848"),
# x = ~seq(ms("00:00"), ms("10:10")),
# x = ~ lubridate::ms(Time2),
# x = ~ lubridate::as_datetime(Time1),
y = ~ BT,
# hovertemplate = paste('%{y: .1f}\u00b0F', '<br>%{x}<br>'),
hovertemplate = '%{y: .1f}\u00b0F',
showlegend = FALSE,
name = "BT"
) %>%
plotly::add_trace(
times,
# ET Line
mode = 'lines',
x = ~ lubridate::as_datetime(time),
y = ~ ET,
line = list(color = "#D50032"),
name = "ET"
) %>%
# add_trace( # Change BT Line
# mode = 'lines',
# x = ~ lubridate::as_datetime(Time2),
# y = ~ change_BT,
# line = list(color = "#428BCA"),
# name = "\u0394BT",
# yaxis = "y2"
# ) %>%
plotly::layout(hovermode = "x unified") %>%
# filter(!is.na(Event),
# !is.na(Time2),
# Event != "Drop",
# !grepl("^Charge", Event)) %>%
plotly::add_annotations(
x = ~lubridate::as_datetime(as.numeric(special_times$time_of_event)), # jitter() ?
y = ~ 400,
text = ~ special_times$type_of_event,
# yaxis = "y2",
textposition = "top center",
showarrow = FALSE,
# arrowhead = .5,
# arrowwidth = 1,
font = list(size = 12, color = "black")
# bgcolor = ~ event_color
) %>% # Add lines for phases
plotly::add_segments(
x = ~ dry_end,
xend = ~ dry_end,
y = ~ 0,
yend = ~ max_temp,
# opacity = 1,
line = list(
dash = "dash",
color = '#AAAAAA',
width = 2
),
text = "Dry end"
) %>%
plotly::add_segments(
x = ~ first_crack_start,
xend = ~ first_crack_start,
y = ~ 0,
yend = ~ max_temp,
# opacity = 1,
line = list(
dash = "dash",
color = '#AAAAAA',
width = 2
),
text = "FC start"
) %>%
plotly::add_segments(
x = ~ first_crack_end,
xend = ~ first_crack_end,
y = ~ 0,
yend = ~ max_temp,
# opacity = 1,
line = list(
dash = "dash",
color = '#AAAAAA',
width = 2
),
text = "FC start"
) %>%
# For second_crash_start
# add_segments( x = ~first_crack_start, xend = ~first_crack_start, y =~ 0, yend=~500,
# # opacity = 1,
# line = list(dash="dash",
# color = 'gray80',
# width = 2), text = "FC start") %>%
plotly::add_segments(
x = ~ drop_time,
xend = ~ drop_time,
y = ~ 0,
yend = ~ max_temp,
# opacity = 1,
line = list(
dash = "dash",
color = '#AAAAAA',
width = 2
),
text = "FC start"
) %>%
plotly::layout(
# The right side y-axis
yaxis2 = list(
zeroline = F,
showline = F,
showgrid = F,
tickfont = list(color = "#428BCA"),
ticksuffix = "\u00b0F",
overlaying = "y",
side = "right",
title = ""
),
xaxis = list(
# gridcolor = toRGB("gray85"),
title = "",
zeroline = F,
showline = F,
showgrid = F,
tick0 = time_zero,
ticks = "inside",
tickcolor = "rgb(245,245,245)",
tickformat = "%M:%S",
dtick = 30000 # Tick every 30 seconds
),
yaxis = list(
title = "",
ticksuffix = "\u00b0F",
zeroline = F,
showline = F,
showgrid = F
),
margin = list(
r = 30,
l = 0,
b = 0,
t = 0
),
plot_bgcolor = 'rgb(245,245,245)',
# make grey background
paper_bgcolor = 'rgb(245,245,245)'
)
# mess with format
x=lubridate::as_datetime(as.numeric(times$time))
lubridate::hms(x)
lubridate::minute(x)
lubridate::seconds(x)
lubridate::seconds_to_period(as.numeric(times$time)) %>% lubridate::ms() # THIS?
lubridate::fast_strptime(x, format = "%H%M")
(parse_date_time2(times$time))
sub(":\\d{2}", "", times((minutes%/%60 + minutes%%60 /3600)/24))
as.numeric(times$time)%/%60 + as.numeric(times$time)%%60 /3600
plotly::plot_ly(
# BT Line
times,
type = 'scatter',
mode = 'lines',
x = ~ lubridate::as_datetime(as.numeric(time)),
line = list(color = "#4DB848"),
# x = ~seq(ms("00:00"), ms("10:10")),
# x = ~ lubridate::ms(Time2),
# x = ~ lubridate::as_datetime(Time1),
y = ~ BT,
# hovertemplate = paste('%{y: .1f}\u00b0F', '<br>%{x}<br>'),
hovertemplate = '%{y: .1f}\u00b0F',
showlegend = FALSE,
name = "BT"
) %>% plotly::layout(xaxis = list(tickformat = "%M:%S"))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KZmlsZW5hbWUgPC0NCiAganNvbmxpdGU6OnJlYWRfanNvbigiQzovVXNlcnMvamFjY2kvRG9jdW1lbnRzL0RTIDcxMC9jb2ZmZWVfcm9hc3RpbmdfcHJvZmlsZXMvZGF0YS1yYXcvc2F2ZWQvSGFpdGktLTIwMjEtMDItMDktMjAtMTUtMTcuanNvbiIpDQojIGZpbGVuYW1lMiA8LQ0KIyBqc29ubGl0ZTo6dG9KU09OKCJDOi9Vc2Vycy9qYWNjaS9Eb2N1bWVudHMvRFMgNzEwL2NvZmZlZV9yb2FzdGluZ19wcm9maWxlcy9kYXRhLXJhdy9zYXZlZC9BbmdvbGEtLTIwMjEtMDItMjYtMTYtMTYtMjIuanNvbiIpDQpgYGANCmBgYHtyfQ0KZ2V0X2RhdGFfdG9fZGlzcGxheV9hdF91cGxvYWQoZmlsZW5hbWUpDQpnZXRfc3BlY2lhbF9ldmVudF90aW1lcyhmaWxlbmFtZSkgDQpnZXRfZGF0YV9vZl90aW1lc190ZW1wcyhmaWxlbmFtZSkgDQpnZXRfZXZlbnRfdGltZXMoZmlsZW5hbWUpDQpgYGANCmBgYHtyIHB1dCBkYXRhIGluIGNoYXJ0fQ0KdGltZXMgPC0NCiAgZ2V0X2RhdGFfb2ZfdGltZXNfdGVtcHMoZmlsZW5hbWUpICU+JQ0KICBkcGx5cjo6bXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykjDQpzcGVjaWFsX3RpbWVzIDwtIGdldF9zcGVjaWFsX2V2ZW50X3RpbWVzKGZpbGVuYW1lKQ0KZXZlbnRfdGltZXMgPC0NCiAgZ2V0X2V2ZW50X3RpbWVzKGZpbGVuYW1lKSAlPiUNCiAgZHBseXI6Om11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpDQoNCiAgICAjIEdldCBkYXRhIGZvciBjZXJ0YWluIHBhcmFtZXRlcnMgZm9yIGNoYXJ0DQogICAgdGltZV96ZXJvID0gbHVicmlkYXRlOjphc19kYXRldGltZSgiMTk3MC0wMS0wMSAwMDowMDowMCBVVEMiKQ0KICAgICMgdGltZV9tYXggPSBtYXgoYXNfZGF0ZXRpbWUocHJvZmlsZSRUaW1lMiksIG5hLnJtID0gVFJVRSkNCiAgICBkcnlfZW5kID0gbHVicmlkYXRlOjphc19kYXRldGltZShldmVudF90aW1lcyRkcnlfdGltZSkNCiAgICBmaXJzdF9jcmFja19zdGFydCA9IGx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoZXZlbnRfdGltZXMkZmNfdGltZV9zdGFydCkNCiAgICBmaXJzdF9jcmFja19lbmQgPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGV2ZW50X3RpbWVzJGZjX3RpbWVfZW5kKQ0KICAgIHNlY29uZF9jcmFja19zdGFydCA9IGx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoZXZlbnRfdGltZXMkc2NfdGltZV9zdGFydCkNCiAgICBkcm9wX3RpbWUgPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGV2ZW50X3RpbWVzJGRyb3BfdGltZSkNCiAgICBtYXhfdGVtcCA9IDUwMCAjIEhpZ2hlc3QgdGVtcCBpbiBjaGFydA0KcGxvdGx5OjpwbG90X2x5KA0KICAjIEJUIExpbmUNCiAgdGltZXMsDQogIHR5cGUgPSAnc2NhdHRlcicsDQogIG1vZGUgPSAnbGluZXMnLA0KICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKHRpbWUpLA0KICBsaW5lID0gbGlzdChjb2xvciA9ICIjNERCODQ4IiksDQogICMgeCA9IH5zZXEobXMoIjAwOjAwIiksIG1zKCIxMDoxMCIpKSwNCiAgIyB4ID0gfiBsdWJyaWRhdGU6Om1zKFRpbWUyKSwNCiAgIyB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKFRpbWUxKSwNCiAgeSA9IH4gQlQsDQogICMgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCcle3k6IC4xZn1cdTAwYjBGJywgJzxicj4le3h9PGJyPicpLA0KICBob3ZlcnRlbXBsYXRlID0gJyV7eTogLjFmfVx1MDBiMEYnLA0KICBzaG93bGVnZW5kID0gRkFMU0UsDQogIG5hbWUgPSAiQlQiDQopICU+JQ0KICBwbG90bHk6OmFkZF90cmFjZSgNCiAgICB0aW1lcywNCiAgICAjIEVUIExpbmUNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKHRpbWUpLA0KICAgIHkgPSB+IEVULA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gIiNENTAwMzIiKSwNCiAgICBuYW1lID0gIkVUIg0KICApICU+JQ0KICAjIGFkZF90cmFjZSggICAgICAgICMgQ2hhbmdlIEJUIExpbmUNCiAgIyAgIG1vZGUgPSAnbGluZXMnLA0KICAjICAgeCA9IH4gbHVicmlkYXRlOjphc19kYXRldGltZShUaW1lMiksDQogICMgICB5ID0gfiBjaGFuZ2VfQlQsDQogICMgICBsaW5lID0gbGlzdChjb2xvciA9ICIjNDI4QkNBIiksDQogICMgICBuYW1lID0gIlx1MDM5NEJUIiwNCiAgIyAgIHlheGlzID0gInkyIg0KICAjICkgJT4lDQogIHBsb3RseTo6bGF5b3V0KGhvdmVybW9kZSA9ICJ4IHVuaWZpZWQiKSAlPiUNCiAgIyBmaWx0ZXIoIWlzLm5hKEV2ZW50KSwNCiAgIyAgICAgICAgIWlzLm5hKFRpbWUyKSwNCiAgIyAgICAgICAgRXZlbnQgIT0gIkRyb3AiLA0KICAjICAgICAgICAhZ3JlcGwoIl5DaGFyZ2UiLCBFdmVudCkpICU+JQ0KcGxvdGx5OjphZGRfYW5ub3RhdGlvbnMoDQogIHggPSAgfmx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoYXMubnVtZXJpYyhzcGVjaWFsX3RpbWVzJHRpbWVfb2ZfZXZlbnQpKSwgIyBqaXR0ZXIoKSA/DQogIHkgPSB+IDQwMCwNCiAgdGV4dCA9IH4gc3BlY2lhbF90aW1lcyR0eXBlX29mX2V2ZW50LA0KICAjIHlheGlzID0gInkyIiwNCiAgdGV4dHBvc2l0aW9uID0gInRvcCBjZW50ZXIiLA0KICBzaG93YXJyb3cgPSBGQUxTRSwNCiAgIyBhcnJvd2hlYWQgPSAuNSwNCiAgIyBhcnJvd3dpZHRoID0gMSwNCiAgZm9udCA9IGxpc3Qoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpDQogICMgYmdjb2xvciA9IH4gZXZlbnRfY29sb3INCikgJT4lICAgICAgICAgICAgICAgICAgICAgIyBBZGQgbGluZXMgZm9yIHBoYXNlcw0KcGxvdGx5OjphZGRfc2VnbWVudHMoDQogIHggPSB+IGRyeV9lbmQsDQogIHhlbmQgPSB+IGRyeV9lbmQsDQogIHkgPSAgfiAwLA0KICB5ZW5kID0gIH4gbWF4X3RlbXAsDQogICMgb3BhY2l0eSA9IDEsDQogIGxpbmUgPSBsaXN0KA0KICAgIGRhc2ggPSAiZGFzaCIsDQogICAgY29sb3IgPSAnI0FBQUFBQScsDQogICAgd2lkdGggPSAyDQogICksDQogIHRleHQgPSAiRHJ5IGVuZCINCikgJT4lDQogIHBsb3RseTo6YWRkX3NlZ21lbnRzKA0KICAgIHggPSB+IGZpcnN0X2NyYWNrX3N0YXJ0LA0KICAgIHhlbmQgPSB+IGZpcnN0X2NyYWNrX3N0YXJ0LA0KICAgIHkgPSAgfiAwLA0KICAgIHllbmQgPSAgfiBtYXhfdGVtcCwNCiAgICAjIG9wYWNpdHkgPSAxLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgZGFzaCA9ICJkYXNoIiwNCiAgICAgIGNvbG9yID0gJyNBQUFBQUEnLA0KICAgICAgd2lkdGggPSAyDQogICAgKSwNCiAgICB0ZXh0ID0gIkZDIHN0YXJ0Ig0KICApICU+JQ0KICBwbG90bHk6OmFkZF9zZWdtZW50cygNCiAgICB4ID0gfiBmaXJzdF9jcmFja19lbmQsDQogICAgeGVuZCA9IH4gZmlyc3RfY3JhY2tfZW5kLA0KICAgIHkgPSAgfiAwLA0KICAgIHllbmQgPSAgfiBtYXhfdGVtcCwNCiAgICAjIG9wYWNpdHkgPSAxLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgZGFzaCA9ICJkYXNoIiwNCiAgICAgIGNvbG9yID0gJyNBQUFBQUEnLA0KICAgICAgd2lkdGggPSAyDQogICAgKSwNCiAgICB0ZXh0ID0gIkZDIGVuZCINCiAgKSAlPiUNCiAgIyBGb3Igc2Vjb25kX2NyYXNoX3N0YXJ0DQogICMgYWRkX3NlZ21lbnRzKCB4ID0gfmZpcnN0X2NyYWNrX3N0YXJ0LCB4ZW5kID0gfmZpcnN0X2NyYWNrX3N0YXJ0LCB5ID1+IDAsIHllbmQ9fjUwMCwNCiAgIyAgICAgICAgICAgICAgICMgb3BhY2l0eSA9IDEsDQogICMgICAgICAgICAgICAgICBsaW5lID0gbGlzdChkYXNoPSJkYXNoIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyYXk4MCcsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDIpLCB0ZXh0ID0gIkZDIHN0YXJ0IikgJT4lDQogIHBsb3RseTo6YWRkX3NlZ21lbnRzKA0KICAgIHggPSB+IGRyb3BfdGltZSwNCiAgICB4ZW5kID0gfiBkcm9wX3RpbWUsDQogICAgeSA9ICB+IDAsDQogICAgeWVuZCA9ICB+IG1heF90ZW1wLA0KICAgICMgb3BhY2l0eSA9IDEsDQogICAgbGluZSA9IGxpc3QoDQogICAgICBkYXNoID0gImRhc2giLA0KICAgICAgY29sb3IgPSAnI0FBQUFBQScsDQogICAgICB3aWR0aCA9IDINCiAgICApLA0KICAgIHRleHQgPSAiRkMgc3RhcnQiDQogICkgJT4lDQogIHBsb3RseTo6bGF5b3V0KA0KICAgICMgVGhlIHJpZ2h0IHNpZGUgeS1heGlzDQogICAgeWF4aXMyID0gbGlzdCgNCiAgICAgIHplcm9saW5lID0gRiwNCiAgICAgIHNob3dsaW5lID0gRiwNCiAgICAgIHNob3dncmlkID0gRiwNCiAgICAgIHRpY2tmb250ID0gbGlzdChjb2xvciA9ICIjNDI4QkNBIiksDQogICAgICB0aWNrc3VmZml4ID0gIlx1MDBiMEYiLA0KICAgICAgb3ZlcmxheWluZyA9ICJ5IiwNCiAgICAgIHNpZGUgPSAicmlnaHQiLA0KICAgICAgdGl0bGUgPSAiIg0KICAgICksDQogICAgeGF4aXMgPSBsaXN0KA0KICAgICAgIyBncmlkY29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICB0aXRsZSA9ICIiLA0KICAgICAgemVyb2xpbmUgPSBGLA0KICAgICAgc2hvd2xpbmUgPSBGLA0KICAgICAgc2hvd2dyaWQgPSBGLA0KICAgICAgdGljazAgPSB0aW1lX3plcm8sDQogICAgICB0aWNrcyA9ICJpbnNpZGUiLA0KICAgICAgdGlja2NvbG9yID0gInJnYigyNDUsMjQ1LDI0NSkiLA0KICAgICAgdGlja2Zvcm1hdCA9ICIlTTolUyIsDQogICAgICBkdGljayA9IDMwMDAwICMgVGljayBldmVyeSAzMCBzZWNvbmRzDQogICAgKSwNCiAgICB5YXhpcyA9IGxpc3QoDQogICAgICB0aXRsZSA9ICIiLA0KICAgICAgdGlja3N1ZmZpeCA9ICJcdTAwYjBGIiwNCiAgICAgIHplcm9saW5lID0gRiwNCiAgICAgIHNob3dsaW5lID0gRiwNCiAgICAgIHNob3dncmlkID0gRg0KICAgICksDQogICAgbWFyZ2luID0gbGlzdCgNCiAgICAgIHIgPSAzMCwNCiAgICAgIGwgPSAwLA0KICAgICAgYiA9IDAsDQogICAgICB0ID0gMA0KICAgICksDQogICAgcGxvdF9iZ2NvbG9yID0gJ3JnYigyNDUsMjQ1LDI0NSknLA0KICAgICMgbWFrZSBncmV5IGJhY2tncm91bmQNCiAgICBwYXBlcl9iZ2NvbG9yID0gJ3JnYigyNDUsMjQ1LDI0NSknDQogICkNCmBgYA0KYGBge3J9DQojIG1lc3Mgd2l0aCBmb3JtYXQNCg0KeD1sdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGFzLm51bWVyaWModGltZXMkdGltZSkpDQpsdWJyaWRhdGU6Omhtcyh4KQ0KbHVicmlkYXRlOjptaW51dGUoeCkNCmx1YnJpZGF0ZTo6c2Vjb25kcyh4KQ0KbHVicmlkYXRlOjpzZWNvbmRzX3RvX3BlcmlvZChhcy5udW1lcmljKHRpbWVzJHRpbWUpKSAlPiUgbHVicmlkYXRlOjptcygpICMgVEhJUz8NCmx1YnJpZGF0ZTo6ZmFzdF9zdHJwdGltZSh4LCBmb3JtYXQgPSAiJUglTSIpDQoocGFyc2VfZGF0ZV90aW1lMih0aW1lcyR0aW1lKSkNCg0Kc3ViKCI6XFxkezJ9IiwgIiIsIHRpbWVzKChtaW51dGVzJS8lNjAgKyAgbWludXRlcyUlNjAgLzM2MDApLzI0KSkNCg0KYXMubnVtZXJpYyh0aW1lcyR0aW1lKSUvJTYwICArICBhcy5udW1lcmljKHRpbWVzJHRpbWUpJSU2MCAvMzYwMA0KDQoNCiAgIHBsb3RseTo6cGxvdF9seSgNCiAgICAgICMgQlQgTGluZQ0KICAgICAgdGltZXMsDQogICAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgICAgbW9kZSA9ICdsaW5lcycsDQogICAgICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGFzLm51bWVyaWModGltZSkpLA0KICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiIzREQjg0OCIpLA0KICAgICAgIyB4ID0gfnNlcShtcygiMDA6MDAiKSwgbXMoIjEwOjEwIikpLA0KICAgICAgIyB4ID0gfiBsdWJyaWRhdGU6Om1zKFRpbWUyKSwNCiAgICAgICMgeCA9IH4gbHVicmlkYXRlOjphc19kYXRldGltZShUaW1lMSksDQogICAgICB5ID0gfiBCVCwNCiAgICAgICMgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCcle3k6IC4xZn1cdTAwYjBGJywgJzxicj4le3h9PGJyPicpLA0KICAgICAgaG92ZXJ0ZW1wbGF0ZSA9ICcle3k6IC4xZn1cdTAwYjBGJywNCiAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSwNCiAgICAgIG5hbWUgPSAiQlQiDQogICAgKSAlPiUgcGxvdGx5OjpsYXlvdXQoeGF4aXMgPSBsaXN0KHRpY2tmb3JtYXQgPSAiJU06JVMiKSkNCmBgYA0KDQoNCg==